/*
 * CameraManager - 摄像头管理工具类
 * 功能：提供ESP32摄像头的基本控制，包括初始化、帧获取等功能
 */
#ifndef CAMERA_MANAGER_H
#define CAMERA_MANAGER_H

#include "esp_camera.h"

// 摄像头工作状态枚举
enum CameraStatus {
  CAMERA_IDLE = 0,    // 空闲状态
  CAMERA_INITIALIZING, // 初始化中
  CAMERA_READY,       // 就绪状态
  CAMERA_RUNNING,     // 运行中
  CAMERA_ERROR        // 错误状态
};

// 图片帧结构
typedef struct {
  uint8_t *data;      // 图片数据
  size_t size;        // 数据大小
  camera_fb_t *fb;    // 原始帧缓冲区指针，内部使用
} CameraFrame;

// 状态改变回调函数类型
typedef void (*CameraStatusCallback)(CameraStatus status);

// 帧获取回调函数类型
typedef void (*FrameCallback)(CameraFrame &frame);

class CameraManager {
public:
  // 构造函数和析构函数
  CameraManager();
  ~CameraManager();

  // 初始化摄像头
  bool init();

  // 开始定时获取图片帧
  // 参数：callback - 帧获取回调函数
  //       intervalMs - 帧获取间隔时间（毫秒）
  bool startCapture(FrameCallback callback, unsigned long intervalMs);

  // 停止定时获取图片帧
  void stopCapture();

  // 单独获取一帧图片
  // 返回：CameraFrame结构，包含图片数据和大小
  CameraFrame getFrame();

  // 设置状态改变回调函数
  void setStatusCallback(CameraStatusCallback callback);

  // 获取当前摄像头状态
  CameraStatus getStatus() const;

  // 释放帧资源
  // 参数：frame - 需要释放的帧
  static void releaseFrame(CameraFrame &frame);

  // 主循环处理函数，需要在main的loop中调用
  void loop();
  
  // 销毁摄像头实例，释放所有资源
  void destroy();

private:
  CameraStatus _status;                 // 当前摄像头状态
  FrameCallback _frameCallback;         // 帧获取回调函数
  CameraStatusCallback _statusCallback; // 状态改变回调函数
  unsigned long _captureInterval;       // 帧获取间隔时间
  unsigned long _lastCaptureTime;       // 上次捕获时间
  bool _isCapturing;                    // 是否正在捕获

  // 更新摄像头状态
  void _updateStatus(CameraStatus newStatus);

  // 执行一次帧捕获
  void _captureFrame();
};

#endif // CAMERA_MANAGER_H